<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>严格模式</title>
</head>
<body>
  <script>
    // 从ES5开始，函数内部可以设定为严格模式
    function doSomething(a, b) {
      'use strict'
    }
    /**
     * ES2016做了一点修改，规定只要函数参数使用了默认值、解构赋值、或者扩展运算符，
     * 那么函数内部就不能显式设定为严格模式，否则会报错
    */
   function doAny(a, b = a) { // 报错
    'use strict'
   }
   const doSomething = function ({a, b}) { //报错
     'use strict'
   }
   // 报错
  const doSomething = (...a) => {
     'use strict';
    // code
  };
  /**
   * 这样规定的原因是，函数内部的严格模式，同时适用于函数体和函数参数。但是，函数执行的时候，先执行函数参数，然后再执行函数体，这样就有一个不合理的地方，
   * 只有从函数体中，才能知道参数是否应该以严格模式执行，但是参数却应该先于函数体执行。
   * 如果想要在函数内部运用严格模式，还要用上述的几种用法，如何避免冲突？
  */
  </script>
  <script>
    // 方法一：设定全局性的严格模式，这是合法的
    'use strict'
    function doSomething(a, b = a) {
      //code
    }
    // 方法二：把函数包在一个无参数的立即执行函数里面。
    const doSomething = (function() {
      'use strict'
      return function (value = 42) {
        return value
      }
    })()
  </script>
</body>
</html>